查看原文
其他

你一定不知道的 AppStore 秘密

iOS大全 2022-07-03

推荐关注↓

一、前言

对于 iOS 开发者来说 App Store 是必经之路,大家一定多多少少都会有了解。但 App Store 的功能之多,并且每年都有更新,比如上一篇文章我们讲到 《解读 AppStore 新功能:自定义产品页面和 A/B Test 工具》,所以本文对一些大家平时经常接触的功能,但可能忽视的一些细节进行解说,也会对一些平时大家很少接触的功能进行探索。可能不是最全的,但一定有你不知道的 App Store 秘密!

二、AppStore 秘密

我们的 SDK 包含 250,000 个 API,为您在 app 中构建高级功能提供了无限的可能性。过去 4 年发布的 iPhone 设备中 92% 都在运行 iOS 13,因此您可以放心地利用最新技术来交付功能。

来源:App Store \- Apple Developer[1]

  • 1 个生态系统。
  • 5 个平台。
  • 40 种语言。
  • 175 个地区。
  • 每周 5 亿访客。
  • 15 亿台 Apple 设备。

关于苹果 App Store 服务,大家最熟悉的包含有 App Store app、IAP(In App Purchase,应用内购买)、App 预订、App 评论搜索等。那么,我们一起来看看,有那些不为大家所知的秘密吧~

2.1 系统状态

比如上周五,苹果 App Store 出现故障,导致 无法连接 App Store,用户无法打开的问题:

针对以上这个情况,有没有办法可以提前预测呢?很遗憾告诉大家,目前苹果官方还没有提供实时的系统服务状态查询,在苹果官网的帮助可以查看到这样的 系统状态页面[2]

从上图可以看到,Apple BooksiTunes Store 服务在 2016-04-26 时因一些不可抗拒的原因在中国内地中断至今。而 Apple Pay & Wallet 钱包功能出现服务中断:

2021-07-23 上午7:00 - 现在,部分用户受到影响,岭南通·羊城通的持卡人可能无法使用 Apple Pay 的部分功能。

从这个服务中断就可以看出来,苹果的这个系统状态通知,并不是实时的公告,而是有延迟,有时候是修复后才出通知公告。

关于系统状态页面,不同地区是不同的链接,小编整理常见的列表:

国家/地区语言代号链接
中国zh_CNwww.apple.com/cn/support/…[3]
美国en_USwww.apple.com/support/sys…[4]
中国香港zh_HKwww.apple.com/hk/support/…[5]
中国台湾zh_TWwww.apple.com/tw/support/…[6]
韩国ko_KRwww.apple.com/kr/support/…[7]
日本ja_JPwww.apple.com/jp/support/…[8]
新加坡en_SGwww.apple.com/sg/support/…[9]
俄罗斯ru_RUwww.apple.com/ru/support/…[10]
德国de_DEwww.apple.com/de/support/…[11]

从这里可以看到,每个国家或地区的链接中代码,那么这个语言代号可以从苹果 Choose Your Country or Region[12] 网页的源代码中获取,这也是苹果目前支持的国家和地区。

以上是针对用户层面的服务,比如 App Store、iCloud 是否可用等,那么针对开发者来说,有没有苹果服务 API 的系统状态呢?其实也是有的。

开发者系统状态

从这个图片可出来,针对 App Store 的服务有很多,App Store ConnectApp Store SandboxApp Store Server NotificationsIn-App PurchasesApp Store Receipt Verification 等,从而可以看出这个页面的信息非常的重要!当然,这个目前苹果官方也没有实现的通知。比如这个:

Resolved Outage(已解决的中断) Today, 12:58 AM - 1:07 AM Some users were affected Affected Services: App Store Connect, App Store Connect API, TestFlight Users experienced a problem with this service.

因为这些服务目前是针对开发者服务,目前还没有分国家或地区的服务器,统一用这个 developer.apple.com/system-stat…[13] 页面查看开发者系统状态。一般来说,当出现大面积的无法使用的服务时,可以通过查看状态确认是不是苹果服务器问题。

比如,经常遇到苹果沙盒环境无法充值(App Store Sandbox)、线上用户无法充值(In-App PurchasesApp Store Receipt Verification),只能说,遇到问题时怀疑是苹果的服务问题,可以看看这个页面。但这个页面也不时实时刷新,出现大面积的无法使用,依然是看看大家(同行)或者新闻的消息。

注:为什么没有实时,我想是目前苹果的服务遍布全球,想要全盘实时通知,一方面是影响的时长,另一方面影响的范围,不是不可以,可能是需要时间?可以肯定苹果有内部系统报警,但如果遇到问题,马上通知开发者?评估影响时长和范围?还是应该马上修复?这里就不深入探讨,看看苹果未完待续。

既然苹果这样,那么我们来对比一下谷歌,看看有没有不一样的发现?首先是 Google 产品和服务的流量和中断记录页面会显示:

可以看到谷歌服务的中断情况,网页中还有按国家、地区的筛选条件,这里就不展开了,大家想了解可以看看啊。

而谷歌常见服务出现故障甚至宕机时,在 Google Workspace 状态信息中心[14] 页面可以查看:

页面底部有一个入口,Google Workspace 历史记录[15] 可以查看某个服务的中断时间,影响时长等。相对于苹果的服务来说,还提供 RSS 和 JSON 历史记录接口,甚至是 帮助文档[16],显得更加完善和友好:

谷歌的系统状态查看服务有:Google Workspace[17]Google Cloud Status Dashboard[18]Firebase Status Dashboard[19]Google Ads[20] 等,页面风格统一。Google Play Store 的系统状态,小编没有找到入口;而谷歌系统状态信息的实时性暂时没有相关资料,有懂的朋友,可以在评论区一起交流哈~

从网上资料看,谷歌服务出现故障的情况好像不多,毕业谷歌有商业化的云服务,出故障是不可能的?而苹果,一般是服微软和亚马逊的云服务,而在中国的 iCloud 服务是用云上贵州,其它的服务暂时还是统一服务器?

当然,关于实时性,也有第三方的服务监听苹果和谷歌的服务。比如 Downdetector[21]Google Play not working\?[22]Google Workspace Status[23] 。这里就不展开了,毕竟第三方也是监听,从最优方案当然是官方支持。

最后,一般做用户产品的 app 都会遇到用户反馈:如果您无法连接到 App Store、iTunes Store 或其他 Apple 服务[24],但是文档是发生问题后的解决方案,能不能优化一下减少出问题呢?关于服务系统状态查询,它的目的是什么?肯定不是出问题后,给大家通告一下就完事吧,而应该是向更高实时性提高!加油吧苹果!

2.2 App 订阅

苹果内购订阅是很常见的类型,比如音乐、视频类 app 的持续包月,以前可能用户在 app 里订阅后,以为是一次性或者想准备到期后在取消,然后就被自动扣费了。这一招现在支付宝和微信早就学会了。还有一个原因,是以前苹果的 App Store 账号管理在首页下滚到最底部,总之经过的步骤很复杂,一般小白用户很难找。

其实,关于管理 app 订阅,以前是可能通过 https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/manageSubscriptions 链接打开 App Store 会自动显示用户的订阅信息界面,但一般开发者不会提供,甚至是开发者都不知道有这个链接。

现在,最新的 iOS 14 以后,App Store 用户账号很方便找到入口,在“帐户”,然后轻按“订阅”就可以管理订阅了。当然,如果开发者愿意引导用户打开订阅管理界面,可以用最新的这个苹果链接 https://apple.co/2Th4vqI。更多关于取消订阅可以参考 如何取消 Apple 提供的订阅[25] 文档。

最后,苹果在 WWDC21 推出了在 app 里管理用户订阅项目的界面,不用在跳转到 App Store,具体可以翻看之前的文章 苹果内购 \- WWDC21[26]

2.3 App 链接

在 2019 年以前,苹果的 app 商店链接,一直都是 itunes.apple.com,举例来说是这样的:https://itunes.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472。因为 iTuens 是苹果的音乐播放和管理的软件,iPhone 可以说是从 iPod 升级而来,关于 iTuens 这里就不多说,因为苹果已经弃用并且,并转移到 Apple Music 和 Apple 播客这两个 app 中,详细可以查看 iTunes \- Apple[27]

2019年6月14号,苹果宣布[28] AppStore 商店App下载地址从 itunes.apple.com 更换为 apps.apple.com。比如用 https://itunes.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472 请求时,会自动跳转到 https://apps.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472。所以大家建议用新的链接,减少页面跳转。

当然,这个链接里有一个 cn 这个是国家或地区的标识,这个标识跟前文提到的是一样的。如果你的应用只上中国内地,那么就用 cn,用其它的也不影响中国内地账号用户访问,而其它地区的用户账号访问时会提示:目前您所在国家或地区尚不提供此App。而如果是选择全球所有的地区都发布,那么用什么地区标识都可以打开。

更进一步,不带地区也是可以,比如:https://apps.apple.com/app/斗罗大陆-魂师对决/id1558453472,甚至带游戏名也不用带 https://apps.apple.com/app/id1558453472。不带这些参数的话,用电脑上打开显示 Connecting to the iTunes Store...,但是可以正常跳转到 App Store:

带所有的参数时,会显示 App Store 预览页面:

所以,关于 App 链接,最好的链接格式,应该是这样:https://apps.apple.com/cn/app/id1558453472。带有地区和 apple id 标识就可以了,游戏名可以不需要带上。

App Store 开发者页面

那么有一个问题,app 可以通过链接跳转到 App Store,那么可能通过链接跳转到 App Store 的开发者界面吗?

很显然是可以的!比如这个链接:https://apps.apple.com/cn/developer/khorgas-zhifan-network-technology-co-ltd/id1540746184,需要注意这个 id1540746184 是开发者账号的id,不是 app 的。那么问题来了,怎么获取这个开发者页面的链接呢?

答案就是,在浏览器打开开发者的某个 app 的预览页面,然后开发者名字那一栏,就是开发者页面的链接,复制一下就可以啦~

2.4 App 评论

在所有的 iOS 版本中,通过 app 链接拼接 action=write-review 时,都可以跳转到 App Store 打开评估页面。比如 https://apps.apple.com/cn/app/id1558453472?action=write-review 。需要注意的是,如果用户从来没有下载过此 app,则跳转后会提示必须拥有此项目才能评论:

而在 iOS 10.3 以上,苹果提供了 app 内评论的功能,方法也很简单,调用苹果的 API 接口 [SKStoreReviewController requestReview] 就可以:

App内评分功能注意事项

  • 仅支持 iOS 10.3+ 以上
  • 评分弹窗是标准化,不提供自定义UI或控制评分功能
  • 开发环境每次调用都会显示评分界面
  • TestFlight 环境不会显示评分界面
  • 生产环境一个用户账号最多显示3次/365天
  • 生产环境如果已经评论成功,再调用不会再弹

很多开发者如果不太留意,看到上面的弹窗,会以为只能在 App Store 才能文字评论。其实,在 app 内也可以写评论,在星级评论提交后,会显示下面的界面:

用户还可以选择,要不要撰写评论。当然点击”“表示不写文字评论了。

app 评分数量太少,可能会降低用户下载 app 的意愿,所以,苹果提高了这样的接口给开发者来选择。那么对于开发者来说,可以得到更多用户评论的机会,但如果不转移到 App Store 评论,就减少了 app 的曝光量。当然,好的 app 会消除了用户的顾虑,但酒香也怕巷子深,需要开发者多维度思考。

最后,从用户角度来看,如果你觉得 app 内评论影响到你的使用体验,其实你是可以在设置里关闭的:

在设置的 App Store 子页面中,可以选择关闭。所以,苹果的产品,确实会更多的站在用户体验来思考,不仅仅是(不)满足开发者。

2.5 iTunes Store API

苹果提供了一套 API 给开发者用来获取 iTunes Store、App Store、iBooks Store 和Mac App Store 的内容信息,包括 App、iBooks、电影、播客、音乐、音乐视频、有声读物和电视节目等。

比如获取 app 的最新信息,请求 https://itunes.apple.com/cn/lookup?id=1558453472 可以获取到:

{
 "resultCount"1,
 "results": [
  {
   "advisories": [
    "偶尔/轻微的卡通或幻想暴力""偶尔/轻微的现实暴力"
   ],
   "appletvScreenshotUrls": [
   ],
   "artistId"1540746184,
   "artistName""Khorgas Zhifan Network Technology Co., Ltd.",
   "artistViewUrl""https://apps.apple.com/cn/developer/khorgas-zhifan-network-technology-co-ltd/id1540746184?uo=4",
   "artworkUrl100"".../100x100bb.jpg",
   "artworkUrl512""https://is2-ssl.mzstatic.com/image/thumb/Purple115/v4/67/ac/7e/67ac7e2b-765c-ac94-9a60-215e975312e4/source/512x512bb.jpg",
   "artworkUrl60"".../60x60bb.jpg",
   "averageUserRating"4.5312200000000002475530891388189047574,
   "averageUserRatingForCurrentVersion"4.5312200000000002475530891388189047574,
   "bundleId""com.khorgas.hsdj",
   "contentAdvisoryRating""12+",
   "currency""CNY",
   "currentVersionReleaseDate""2021-07-20T15:01:04Z",
   "description""———2亿魂师推荐,真3D战斗手游———
21年度国民级IP战斗手游巨作,由阅文集团和腾讯动画正版授权,2亿用户推荐,和动画一模一样的《斗罗大陆:魂师对决》7月22日正式公测!下载与万千魂师即刻对决!
        ...
        ...
        "
,
   "features": [
    "iosUniversal"
   ],
   "fileSizeBytes""1441496064",
   "formattedPrice""免费",
   "genreIds": [
    "6014""7014""7017"
   ],
   "genres": [
    "游戏",
    "角色扮演",
    "策略"
   ],
   "ipadScreenshotUrls": [
    "https://is4-ssl.mzstatic.com/image/thumb/PurpleSource125/v4/33/6f/ee/336fee4b-ced2-a41c-7e53-45ab6ad8e446/86ac5fcd-ba9d-41ee-8a20-63899b6b7697_2732x2048-1.jpg/552x414bb.jpg",
    ...
   ],
   "isGameCenterEnabled"false,
   "isVppDeviceBasedLicensingEnabled"true,
   "kind""software",
   "languageCodesISO2A": [
    "ZH"
   ],
   "minimumOsVersion""10.0",
   "price"0.0,
   "primaryGenreId"6014,
   "primaryGenreName""Games",
   "releaseDate""2021-07-20T07:00:00Z",
   "releaseNotes""1.斗罗大世界全新打造,真实天气交互,沉浸式的斗罗大陆,还每个斗罗迷一个真斗罗!
2.随机融合技玩法,觉醒你的专属武魂,深度培养,自由成长变异,挑战斗罗大陆最强的魂技策略组合!
3.其他优化:引擎、兼容性、画面等全面优化,提升游戏最佳体验!"
,
   "screenshotUrls": [
    "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource125/v4/65/7c/25/657c25a0-3fc7-cab5-b3f3-e46f8ece74d4/440d205f-827a-4446-9b28-2dcce8bef01e_2208x1242-1.jpg/406x228bb.jpg",
    ...
   ],
   "sellerName""Khorgas Zhifan Network Technology Co., Ltd.",
   "supportedDevices": [
    ...
   ],
   "trackCensoredName""斗罗大陆:魂师对决-腾讯动画正版授权",
   "trackContentRating""12+",
   "trackId"1558453472,
   "trackName""斗罗大陆:魂师对决-腾讯动画正版授权",
   "trackViewUrl""https://apps.apple.com/cn/app/%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86-%E9%AD%82%E5%B8%88%E5%AF%B9%E5%86%B3-%E8%85%BE%E8%AE%AF%E5%8A%A8%E7%94%BB%E6%AD%A3%E7%89%88%E6%8E%88%E6%9D%83/id1558453472?uo=4",
   "userRatingCount"44061,
   "userRatingCountForCurrentVersion"44061,
   "version""2.0.2",
   "wrapperType""software"
  }
 ]
}

详细的内容字段,这里就不解析了,看就明白了。对于开发者来说,很方便通过苹果这个链接的数据获取一些信息,比如 app 的图标 artworkUrl512 字段获取,或者是 app 的版本号,可以通过这个信息来判断是否有新版本等。

根据小编经验,一般发布一个新版本后,大概 15 分钟这样,这个链接的数据才会更新,并且这个链接的数据更新后,App Store 才会显示可更新的版本。所以,对于发布新版本对外后,app 何时生效,通过监听这个链接的变动,目前是一个高效的方式,毕竟 app 发布后苹果只保证 24 小时内生效。

因为我们国内用苹果音乐、视频 TV 等比较少,所以这里就不介绍了,详细可以参考:iTunes Search API[29]iTunes Store API[30] 文档。

2.6 App 下载

对于游戏来说,包体一般都是在 1 GB 以上,AppStore 使用蜂窝移动下载的应用包最大多少MB呢?

  • 2017年9月,蜂窝流量下载限制从 100M 扩大到 150M
  • 2019年5月下旬, 蜂窝流量下载限制从 150M 扩大到 200M
  • 2019年9月,iOS 13 正式版发布,可以选择使用蜂窝网络下载(不限制大小)。

所以,低于 iOS 13 的设备,可以使用蜂窝网络下载大小不超过 200 MB 的 App,否则,只能通过 WiFi(手机开热点也可以。)。

对于 iOS 13 以上,如果下载超过 200MB 的应用时,会提示链接 WiFi 时再下载 或 直接使用蜂窝网络下载:

选项可以在设置中更改,请前往“设置” -> “App Store” -> “App下载”:

如上图,在 iOS 13+ 有三个可选项:

  1. 始终允许
  2. 超过 200 MB 时请求许可
  3. 始终询问

所以,2019年9月后,蜂窝流量下载的限制应该是算没有了,苹果不在通过 AppStore 强制来控制,而是把选择权交回给用户。对于开发者来说,这也是一个好消息。

2.7 App 预订

App 预订功能大家应该都有了解过,那么你知道以下几个问题的答案吗?

  • 预订后的发布时间对应北京时间是几点?
  • 用户预订 app 后能取消预订吗?
  • app 上线后怎么区分那些用户是预订过的?
  • app 能像谷歌一样给预订的用户发奖励吗?

App 预订功能为什么这么多问题,原因有几个方面,一是开启 App 预订的前提条件有 2 个:

  1. app 未曾上架商店
  2. app 过审已经通过,等待开发者发布

这 2 个条件已经难道一批开发者,最重要的是测试环境!苹果没有提供 App 预订的测试环境!或者测试的方案!完成让你在生产环境上搞,所以,第一次吃螃蟹的人都是勇(辣)敢(鸡)的战(苹)士(果)!

预订后的发布时间对应北京时间是几点? 这个问题,所有有预订 app 的开发者可能会有这样的疑问。从苹果官方文档中,目前获取不到答案。从经验来说,一般是北京时间 23 点时默认预定发布;当然,开发者可以在苹果后台手动选择马上发布,而跳过系统自动定时发布。那么这个预订发布时间到底是什么时间呢?

假设预订时间是:2020-10-16 那么真实预订生效时间:2020-10-15 北京时间 22:00 生效(或 23:00 生效)

首先,我们想到的是从苹果后台网页的源码查找:

上图的时间戳 1551168000000(毫秒) 转成北京时间为 2019-02-26 16:00:00 。显然不符合预期时间,所以,到底是什么时间?

最后在从苹果的 iTunes Search API 接口获取到 app 的信息(小编注:此接口下文会详细讲解,此处先略过。),接口返回的 Json 数据里有一个字段 releaseDate,大概的内容是这样 "releaseDate": "2021-09-23T07:00:00Z"(预订发布时间是2021年9月23日推出。)。刚开始小编也认为这个时间是 UTC/GMT 时间,最近根据北京时间 22:00 生效(或 23:00 生效)节点,推测苹果的 releaseDate 字段的时间是太平洋时间。那么太平洋时间是什么呢?

从维基百科 太平洋时区[31] 查看:

太平洋时区(Pacific Time Zone)是在美国、加拿大及墨西哥西海岸靠近太平洋地区使用的时区。

  • 太平洋时区:也被称为太平洋时间(Pacific Time,PT)。
  • 其标准时间(冬季)称为太平洋标准时间(Pacific Standard Time,PST),UTC-8;
  • 夏令时间(夏季)称为太平洋夏令时间(Pacific Daylight Time,PDT),UTC-7。

这里可以直接看截图:

这是小编之前在公司内部分享《游戏出海本地化概述》的PPT(预告:下一篇文章会整理分享给大家。)

简单来说,中国标准时间(CST)比世界协调时间(UTC)早 8 小时,而太平洋夏令时间(PDT)比世界协调时间(UTC)晚 7 小时,也就是太平洋夏令时间(PDT)比中国标准时间(CST)晚 15 小时。

所以,太平洋夏令时间 7:00 (7:00 AM) = 北京时间 22:00 (10:00 PM) 。时间是对上了,但是日期没有对上!"releaseDate": "2021-09-23T07:00:00Z",所以这个至今还是一个迷,小编猜想苹果的服务器时间可能历史原因,还是用太平洋时间为基准,比如每年圣诞节暂时审核的时间也是太平洋时间。所以,这个问题有知道的朋友,可以在评论区一起讨论哈~

最后,关于 GMT/UTC/PST 这些时间,夏令时中国也实行过,本文就暂不深入展开,有时候会在单独梳理一篇关于时间的文章,敬请大家期待哈~

1986年至1991年,中华人民共和国在全国范围实行了六年夏令时,每年从4月中旬的第一个星期日2时整(北京时间)到9月中旬第一个星期日的凌晨2时整(北京夏令时)。除1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。夏令时实施期间,将时间向后调快一小时。1992年4月5日后不再实行。

用户预订 app 后能取消预订吗?

答案是肯定可以啊。具体可以在 App Store app 的账户设置里进行取消:

其它方式可以参考 官方文档[32],另外,如果应用是付费下载的方式,那么预订时并不会马上收取费用,在应用发布后,系统会从你的付款方式中收取费用,并且会发一封电子邮件通知你。(注:如果付费应用,在预订期间调整 App 的价格,则会在顾客接受预订的价格和发布当日的价格中,选择较低的价格向顾客收取。)

而预订的用户,在应用发布后,系统是否会自动下载到用户的设备上?如果该用户 启用自动下载[33],则该 App 也会下载至该用户的所有其他设备上。启用自动下载的开关如下图:

app 上线后怎么区分那些用户是预订过的?

曾经一度认为苹果的没有标识预订用户的接口,然后在苹果 营销您的 App[34] 页面的最下面看到一段不起眼的话:

您可以通过收据中的 “preorder\_date \(英文\)[35]” (预订日期) 字段来识别已预订您 app 的顾客。您可以使用此信息为预订用户解锁奖励 (如额外的游戏币),或在 app 内显示感谢购买的信息。

根据苹果的文档 responseBody.Receipt[36],苹果提供了三个用户预约 app 时间的字段(三个不同时间格式):

字段作用(英文)作用(中文)
preorder_dateThe time the user ordered the app available for pre-order, in a date-time format similar to ISO 8601.用户订购可用于预订的 app 的时间,采用类似于 ISO 8601 的日期时间格式。
preorder_date_msThe time the user ordered the app available for pre-order, in UNIX epoch time format, in milliseconds. This field is only present if the user pre-orders the app. Use this time format for processing dates.用户订购可用于预购的 app 的时间,以 UNIX 纪元时间格式,以毫秒为单位。此字段仅在用户预订应用程序时出现。使用此时间格式处理日期。
preorder_date_pstThe time the user ordered the app available for pre-order, in the Pacific Time zone.用户在太平洋时区订购可供预订的 app 的时间。

如果大家熟悉 receipt data,那么肯定会有这样的疑问?通过内购的收据查用户预订状态???对的!从目前的苹果 API 来看,还没有一个针对用户 App Store 信息的库或者一套 API,所以可能苹果工程师从简单的角度来看,预订的数据是 App Store 的数据,而 App Store 的内购又是一套通用的 API,所以直接放在 receipt 里面 ??!!

一切都是这么的(不)合理!为了拿到用户的预订时间,而这么复杂化的流程,并且 receipt 数据比较大,所以,苹果工程师估计也是知道的,所以在 WWDC21 推出了 StoreKit 2,但苹果并没有针对预订状态查询提供新的接口,具体可以翻看之前的文章 苹果内购 \- WWDC21[37]

说了这么多,那么开始说点技术的内容啊,首先是获取苹果 Receipt 收据的接口:

NSString *receiptString = [[NSString alloc] initWithData:[[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]] base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding];

那么问题来了,这个获取的数据,在沙盒环境下,并没有 preorder_date 字段,因为在测试环境下,app 无法模拟预订的过程,所以辣鸡!这时候就是脑洞大开的时间了,那就下载一些之前预订的 app,获取它的 Receipt 数据,看看 preorder_date 的时间就好啦!(还好 App Store 有很多预订中的 app,所以大家用户自己开发一个新 app 然后送审,在然后预订下载,不然这样一个流程下来,估计已经花一个月以上了!)

通过越狱设备,下载预订的 app,然后 Cycript 命令工具,执行 cycript \-p 进程名 或者 cycript \-p 进程ID,然后执行下面的代码,就可以得到 Receipt 数据:

[[NSString alloc] initWithData:[[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]] base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding]

注:Cycript 由 Cydia 创始人 Saurik 推出的一款脚本语言,它混合了 Objective-C 与 JavaScript 语法解释器,能够探测和修改运行中的应用程序。Cycript 主要用于注入目标进程来实现运行时调试,它的优点是重启程序后所有的修改都会失效,对原生程序或代码完全无副作用。关于越狱更多知识,大家自行查阅相关资料啊,这里也不展开了。

最后,把获取到的 Receipt 数据,通过苹果的 verifyReceipt[38] 接口验证,获取到收据的内容:

{
    environment = Production;
    receipt =     {
        "adam_id" = 1558453472;
        "app_item_id" = 1558453472;
        "application_version" = 14;
        "bundle_id" = "com.khorgas.hsdj";
        "download_id" = 111070588400817;
        "in_app" =         (
        );
        "original_application_version" = 14;
        "original_purchase_date" = "2021-07-20 15:39:32 Etc/GMT";
        "original_purchase_date_ms" = 1626795572000;
        "original_purchase_date_pst" = "2021-07-20 08:39:32 America/Los_Angeles";
        "preorder_date" = "2021-05-03 03:34:56 Etc/GMT";
        "preorder_date_ms" = 1620012896000;
        "preorder_date_pst" = "2021-05-02 20:34:56 America/Los_Angeles";
        "receipt_creation_date" = "2021-08-02 02:32:58 Etc/GMT";
        "receipt_creation_date_ms" = 1627871578000;
        "receipt_creation_date_pst" = "2021-08-01 19:32:58 America/Los_Angeles";
        "receipt_type" = Production;
        "request_date" = "2021-08-02 07:18:50 Etc/GMT";
        "request_date_ms" = 1627888730021;
        "request_date_pst" = "2021-08-02 00:18:50 America/Los_Angeles";
        "version_external_identifier" = 843086210;
    };
    status = 0;
}

那么就可以获取到预订的时间:

  • "original_purchase_date" = "2021-07-20 15:39:32 Etc/GMT";
  • "original_purchase_date_ms" = 1626795572000;
  • "original_purchase_date_pst" = "2021-07-20 08:39:32 America/Los_Angeles";

综上,这就是判断一个用户是否为预订用户的方法,是不是感觉绕了一圈子!这也是目前唯一的方法了。另外,如果没有 preorder_date 字段,那么这个用户就是非预订用户,是在预订时间后才下载应用的。

app 能像谷歌一样给预订的用户发奖励吗?

像游戏,一般会给预订的用户,在开服当天发送奖励,那么实现这个预订的用户发放奖励,流程是怎么样?

先说一下 Google Play Store,从 为应用开放预注册服务以提升用户认知度[39] 文档可以看到,开发者可选择提供预注册奖励,只需要在 Play 后台设置状态的商品(内购品项)。整个预订的用户判断和发奖流程,都是谷歌统一来处理和管理,不需要开发者操心!


正如我们上一篇文章说的 解读 AppStore 新功能:自定义产品页面和 A/B Test 工具,Apple & Google、iOS & Android、App Store & Play Store,相互学习相互借鉴,至少目前来说,苹果苹果需要向谷歌学习的地方确实还有很好!加油苹果~

那么 iOS 怎么给预订的用户发送奖励呢?从上面的流程,大家可能已经感受到了。用户是否为预约用户,要先从用户下载的 app 里调用苹果接口获取 Receipt 收据,发送给服务端向苹果验证这个收据,响应的收据信息里,有 preorder_date 字段,判断用户预约的时间,然后就可以判断用户发放奖励等处理逻辑。

详细的发奖励流程,这里就不详细展开了,但这里需要注意一点是防止用户恶意刷取,因为刚刚说了,有没有这个字段是跟用户的 apple id 账号关联的,而一个 apple id 账号是可以登陆多个设备的。可以感受到,苹果的这个预订奖励功能有多烂,没有对比就没有伤害。谷歌的预订奖励是谷歌服务来控制,谷歌可以控制一个谷歌Play用户只能领取一次!

其它的坑点

苹果新后台刚刚改版时,出现了很多问题,其中一个就是预订时间无法更改的Bug,导致了想延迟预订时间都没有办法。不得不吐槽一下苹果,当出现 bug 时,一般是通过邮件或者电话联系开发者当地的客服,而一般开发者反馈的问题都不会得到重视,导致了一些问题让开发者很煎熬!

遇到这种问题时,只能默默选择下架应用,那么下架后,担心已经预订的用户是不是收到下载通知?苹果的文档[40] 有解析:如果您将 App 预订从 App Store 中移除,除非在发布日期之前您再次使其支持预订,否则已经预订了您 App 的顾客将不会收到该 App,且不会向顾客收取费用。此外,一旦发布日期已过,您便不能再次将 App 以预订形式发布。

最后一个问题就是,预订状态的生效时间。用户预订应用后,App Store 会显示灰色的 已预订 按钮,无法点击:

然而,有一些用户就是没有开启自动下载功能,这时候,其实用户是不会自动下载的。然后因为苹果服务器应用发布生效时间只保证 24 小时内,所以,导致这部分用户在 App Store 下载不了的问题!

这时候,除了让用户等苹果应用生效后在手动下载,还有一个方式,就是让用户取消预订应用!具体可以参考文档 取消应用预订[41],然而,这里需要注意一下,如果游戏是开启了预订奖励,那么让用户取消预订在下载,就可能导致用户的预订奖励无法领取啦!

通过这些细节的探究,App Store 功能之多,每一个小功能,都紧密联系,所以导致系统庞大而臃肿,牵一发而动全身,希望苹果能看到这些问题,做的更加好~

2.8 促销代码(兑换码)

借助在 App Store Connect 中配置的促销代码,让媒体和有影响力的用户率先体验您的 app 或 App 内购买项目。您可以为一款 app 在不同平台的每个版本提供最多 100 个促销代码;每款 App 内购买项目也能提供最多 100 个促销代码。

促销代码概述[42]

促销代码可能大家习惯叫兑换码。促销代码的作用,从苹果的角度来看,是让开发者方便给媒体和有影响力的用户率先体验和评测 app。所以,苹果对促销代码的限制比较多,每个 App 内购买项目提供至多 100 个促销代码,每个 App 的 App 内购买项目代码在每六个月内的总上限均为 1000 个(在1月1日和7月1日重置)。这些代码用于非商业用途,并会在请求代码的 28 天之后过期。

促销代码对于开发者来说,唯一的好处是 app 在 App Store 上架之前使用。也就是说,app 过审后,如果没有发布对外,在 App Store 是无法查看的,但通过促销代码,可以在 App Store 里进行兑换下载。并且对兑成功后,这个 app 可以永久下载,但是,苹果会区分促销代码下载的用户,这部分用户无法对 app 进行评价。点击评分时,会提示“您必须拥有此项目”:

2014 年,Apple 收购了 TestFlight,所以现在苹果主力的测试分发方式改为了 TestFlight。但 TestFlight 也有明显无法满足的需求,因为苹果最终还是想让用户通过 App Store 下载 app。所以 TestFlight 发布的 app 每个版本只有 90 天测试时间,如果开发者在 90 天内没有更新,那么用户就无法从 TestFlight 中下载该应用。而已经下载到设备的 app,也会在下载之日起的第 90 天后失效。在某个版本失效或被开发者主动移除前,用户可以随意在应用的不同版本中切换,用于对比版本间的差异。

然后,目前在国区,促销代码代码也换出很多花样,变成一个第三方分发的方式。

最后,除了以上的促销代码,苹果在 iOS 14 时,推出了 订阅优惠代码[43],优惠代码让您能以优惠价格或限时免费形式来提供订阅,可以帮助您获取、留存和赢回订阅用户。苹果对于内购的营销方式支持力度一直是重点,特殊是游戏类是内购的大头。

使用 iOS 14 和 iPadOS 14 及更高版本的顾客可以通过一个一次性代码兑换 URL 在 App Store 上兑换优惠代码;如果开发者在 app 实现了 presentCodeRedemptionSheet \(英文\)[44] API,用户也可以在 app 内直接兑换。

综上,兑换码本身是可以方便开发者为用户提供测试的机会,随着业务需求的变化,开发者更多的是希望通过兑换码,来吸引用户进行下载 app!毕竟,现在让用户下载一个 app 是非常难的事情。

2.9 App Store 工具

说了这么多,对于苹果和开发者来说,App Store 的利益是共赢(至少是不亏),所以推广开发者的 app,对于苹果或者是开发者来说,都是头等大事。对于大公司来说,会有很多营销或者创意进行推广,但对于一般的开发者来说,特别是独立开发者来说,是一种非常不容易的事。所以,我们一起来看看,苹果为开发者提供了那些推广 app 的工具吧~

App Store Marketing Tools

Market with App Store[45] 是一个非常棒的工具,让开发者快速生成需要的推广素材。生成可打开您 App Store 产品页面的短链接或嵌入式代码,并显示您的 app 图标、二维码或 App Store 徽章。

简单来说,开发者通过 Market with App Store[46] 搜索自己的 app,然后就可以点击打开素材的页面:

Content Link 是 app 的下载链接,App Icon 点击左边的 Copy Embed 是一段 html 的代码,效果是如图一样的一个 icon 的图标,点击图标时会跳转到 app 下载链接。右边是下载当前的 icon 图标(分辨率是1000x1000,自动切成苹果的圆角)。

这个是 App Store 下载的徽章,支持白色和黑色风格,还有“下载”方案是支持多语言定义。

最后是 QR Code 二维码,支持黑色、白色、蓝色三种风格,嵌入 app 图标等。这个功能至少来说还是很方便的~

除了 app 的推广素材,还有 Books、Music、News、Podcasts、TV 等,大家有兴趣的可以自行研究哈,这里就不展开了。

其他图案和指南

为了方便开发者,在网站、电子邮件和社交媒体中展示 app,同时显示 Apple 产品图像和 App Store 徽章等。苹果在 营销资源和识别标志指南[47] 页面里提供了很多素材下载。

App Store 徽章提供了下载和预下载的样式,App Store、Mac App Store、Apple TV 三个平台。对于素材来说,所有本地化语言都包含,下载的每个语言文件夹下有 EPSSVG 二种格式的矢量图片。

苹果非常注重品牌的推广和营销,所以开发者的营销材料中使用 Apple 提供的产品图像,苹果建议始终使用 app 当前开发所针对的最新一代产品图像。在 营销资源和识别标志指南[48] 页面还有非常多的详细规范和准则,感兴趣的朋友可以看看哈~

Apple Design Resources

在苹果 Apple Design Resources[49] 页面,可以下载苹果的标准 UI 素材,包括 Sketch、Photoshop 和 XD 模板等格式,方便开发者快速准确地设计 app 效果图。

RSS Generator

通过这个 RSS Feed 生成工具[50] 页面,可能获取 App Store 榜单的应用排名情况,并且是有 Feed 链接可以获取数据,大家有兴趣可以看看。

2.10 iOS 和 iPadOS 的使用情况

App Store \- 支持[51] 页面,苹果提供了最新的 iOS 和 iPadOS 的占比数据:

通过这个数据,可以了解到最新的占比。当然对于不同的地区或者国家,不同的 app,如果要说明产品或者老板 app 不支持 iOS 12 了?可能还是从自家的产品的数据监控为准吧,毕竟苹果这个只是 App Store 的数据,不是苹果的所有设备的系统数据。

2.11 App 侵权争议

开发者开发的 app,可能会面临侵权风险,这个侵权不单单是大家想到的内容抄袭、素材盗用等,比如起的 app 名字,可能别人申请了商标,而你当初起名字时,可能也没有太在意等。随着 App Store 越来越大,其中的利益竟争也必然越来越被重视。开发者在 app 的元数据和内容方面,也需要特别注意。

最后,如果你发现有争议的 app 时,可以通过苹果 Apple \- Legal \- iTunes App Store Content Dispute[52] 页面进行申诉。这个申诉,苹果不会马上对争议的 app 进行处理,而是会给争议双方发送电子邮件,以便双方直接沟通,解决争议。如果你收到苹果的争议邮件,也需要特别注意,及时回复邮件,否则苹果会认为你对争议没有异议,然后将你的 app 下架处理。

2.12 分享您的故事

入选 App Store 精选推荐

App Store 拥有一支全球营销团队,专注于提升 app 的曝光度和用户的参与度。他们会打造各种营销活动和计划,为用户提供帮助、信息和灵感,同时帮助您提升自己 app 和游戏的下载次数与重新下载次数。我们的全球编辑团队根据用户所使用设备的不同,为他们量身打造专属的 App Store app 选购体验,从而在合适的时间和地点,将您的 app 呈现给合适的用户。

最后,我们主要是来说说,假如被苹果推荐后,经常会有同学这样问到,这些素材通过什么方式给苹果呢?格式和标准尺寸是怎么样?

如果 app 被推荐,苹果会在 App Store Connect 开放对应的入口 Promotional Artwork,因为苹果的推荐位有很多种类型,具体可以查看这个 文件的格式[53] 文档。

特别说一下,苹果推荐目前是没有分级或者分账号显示不同的内容,所有的账号显示的推荐内容是一样的。所以,一般最好是老少皆宜的内容,推广素材需要特别注意,举例来说:

详细可以参考这个 App Store 推广图案准则[54] 文档,苹果列举了非常全面的准则和教程,这里就不展开了。

三、总结

文章有点长了,终于总结了 12 个可能是秘密的秘密?不知道大家有没有认真看完,但希望大家有所收获哈~

最后,从开发者角度来说,每个公司的业务都不一样,大家接触的 App Store “秘密”也不尽相同。所以,小编只是从接触过的视角跟大家一起分享,如果大家有更多“秘密”欢迎与我们一起分享,一起交流,一起进步~

欢迎大家一起在评论区交流~

四、参考

  • Apple - Support - System Status[55]
  • Choose your country or region - Apple[56]
  • System Status - Apple Developer[57]
  • 如果您无法连接到 App Store、iTunes Store 或其他 Apple 服务 - Apple 支持 \(中国\)[58]
  • Google Workspace 状态信息中心[59]
  • Google Cloud Status Dashboard[60]
  • 查看 Google Workspace 服务的当前状态 - Google Workspace 管理员帮助[61]
  • Firebase Status Dashboard[62]
  • Google Ads 状态信息中心[63]
  • 为您的 App 提供预订 - App Store - Apple Developer[64]
  • 将您的 App 以预订形式发布 - App Store Connect 帮助[65]
  • 在 App Store、iTunes Store 和 Apple Books 中预订应用、影片、音乐和图书 - Apple 支持[66]
  • responseBody.Receipt | Apple Developer Documentation[67]
  • verifyReceipt | Apple Developer Documentation[68]
  • 如何在 Apple 设备上手动更新 App - Apple 支持 \(中国\)[69]
  • App Store 链接更新 - Apple Developer[70]
  • 为应用开放预注册服务以提升用户认知度 - Play 管理中心帮助[71]
  • 太平洋时区 - 维基百科[72]
  • 苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21[73]
  • 解读 AppStore 新功能:自定义产品页面和 A/B Test 工具[74]
  • App Store - 功能 - Apple Developer[75]
  • 评分、评论和回复 - App Store - Apple Developer[76]
  • iTunes - Apple[77]
  • iTunes Search API: Overview[78]
  • iTunes Store API[79]
  • 如何取消 Apple 提供的订阅 - Apple 支持 \(中国\)[80]
  • 从 App Store 下载 App 和游戏 - Apple 支持[81]
  • 如果无法在 iPhone 或其他 Apple 设备上下载或更新 App - Apple 支持[82]
  • 入选 App Store 精选推荐 - App Store - Apple Developer[83]
  • 探索 App Store 和 Mac App Store - App Store - Apple Developer[84]
  • 促销代码概述 - App Store Connect 帮助[85]
  • 为订阅优惠代码做好准备 - 新闻 - Apple Developer[86]
  • 自动续期订阅 - App Store - Apple Developer[87]
  • Market with App Store[88]
  • 营销资源和识别标志指南 - App Store - Apple Developer[89]
  • App Store 推广图案准则[90]
  • App Store - 支持 - Apple Developer[91]
  • Apple - Legal - iTunes App Store Content Dispute[92]
  • Apple Design Resources - Apple Developer[93]

参考资料

[1]

https://developer.apple.com/cn/app-store/features/

[2]

https://www.apple.com.cn/cn/support/systemstatus/

[3]

https://www.apple.com/cn/support/systemstatus/

[4]

https://www.apple.com/support/systemstatus/

[5]

https://www.apple.com/hk/support/systemstatus/

[6]

https://www.apple.com/tw/support/systemstatus/

[7]

https://www.apple.com/kr/support/systemstatus/

[8]

https://www.apple.com/jp/support/systemstatus/

[9]

https://www.apple.com/sg/support/systemstatus/

[10]

https://www.apple.com/ru/support/systemstatus/

[11]

https://www.apple.com/de/support/systemstatus/

[12]

https://www.apple.com/choose-country-region/

[13]

https://developer.apple.com/system-status/

[14]

https://www.google.com/appsstatus/dashboard/

[15]

https://www.google.com/appsstatus/dashboard/summary

[16]

https://support.google.com/a/answer/139569?hl=zh-Hans

[17]

https://www.google.com/appsstatus/dashboard/

[18]

https://status.cloud.google.com/

[19]

https://status.firebase.google.com/

[20]

https://ads.google.com/status/publisher/

[21]

https://downdetector.com/

[22]

https://downdetector.com/status/google-play/

[23]

https://statusgator.com/services/google-apps

[24]

https://support.apple.com/zh-cn/HT201400

[25]

https://support.apple.com/zh-cn/HT202039

[26]

https://juejin.cn/post/6974733392260644895

[27]

https://www.apple.com.cn/itunes/

[28]

https://developer.apple.com/cn/news/?id=06142019a

[29]

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html

[30]

http://resources.organicfruitapps.com/documentation/itunes-store-web-service-search-api/

[31]

https://zh.wikipedia.org/wiki/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E6%97%B6%E5%8C%BA

[32]

https://support.apple.com/zh-cn/HT202723

[33]

https://support.apple.com/zh-cn/HT202180

[34]

https://developer.apple.com/cn/app-store/pre-orders/

[35]

https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt

[36]

https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt

[37]

https://juejin.cn/post/6974733392260644895

[38]

https://developer.apple.com/documentation/appstorereceipts/verifyreceipt

[39]

https://support.google.com/googleplay/android-developer/answer/9859047?hl=zh-Han

[40]

https://help.apple.com/app-store-connect/?lang=zh-cn#/dev44877b669

[41]

https://support.apple.com/zh-cn/HT202723

[42]

https://help.apple.com/app-store-connect/?lang=zh-cn#/dev50869de4a

[43]

https://developer.apple.com/cn/news/?id=lrnyc3aj

[44]

https://developer.apple.com/documentation/storekit/skpaymentqueue/3566726-presentcoderedemptionsheet

[45]

https://tools.applemediaservices.com/app-store/

[46]

https://tools.applemediaservices.com/app-store/

[47]

https://developer.apple.com/cn/app-store/marketing/guidelines/#section-products

[48]

https://developer.apple.com/cn/app-store/marketing/guidelines/

[49]

https://developer.apple.com/design/resources/

[50]

https://rss.itunes.apple.com/zh-cn

[51]

https://developer.apple.com/cn/support/app-store/

[52]

https://www.apple.com/legal/internet-services/itunes/appstorenotices/#/contacts?lang=zh

[53]

https://help.apple.com/asc/appspromoart/#/itcff8683d86

[54]

https://help.apple.com/asc/appspromoart/?lang=zh-cn/

[55]

https://www.apple.com.cn/cn/support/systemstatus/

[56]

https://www.apple.com/choose-country-region/

[57]

https://developer.apple.com/system-status/

[58]

https://support.apple.com/zh-cn/HT201400

[59]

https://www.google.com/appsstatus/dashboard/

[60]

https://status.cloud.google.com/

[61]

https://support.google.com/a/answer/139569?hl=zh-Hans

[62]

https://status.firebase.google.com/

[63]

https://ads.google.com/status/publisher/

[64]

https://developer.apple.com/cn/app-store/pre-orders/

[65]

https://help.apple.com/app-store-connect/#/dev44877b669

[66]

https://support.apple.com/zh-cn/HT202723

[67]

https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt

[68]

https://developer.apple.com/documentation/appstorereceipts/verifyreceipt

[69]

https://support.apple.com/zh-cn/HT202180

[70]

https://developer.apple.com/cn/news/?id=06142019a

[71]

https://support.google.com/googleplay/android-developer/answer/9859047?hl=zh-Hans

[72]

https://zh.wikipedia.org/wiki/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E6%97%B6%E5%8C%BA

[73]

https://juejin.cn/post/6974733392260644895

[74]

https://juejin.cn/post/6986478834040209445

[75]

https://developer.apple.com/cn/app-store/features/

[76]

https://developer.apple.com/cn/app-store/ratings-and-reviews/

[77]

https://www.apple.com.cn/itunes/

[78]

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html

[79]

http://resources.organicfruitapps.com/documentation/itunes-store-web-service-search-api/

[80]

https://support.apple.com/zh-cn/HT202039

[81]

https://support.apple.com/zh-cn/HT204266

[82]

https://support.apple.com/zh-cn/HT207165

[83]

https://developer.apple.com/cn/app-store/getting-featured/

[84]

https://developer.apple.com/cn/app-store/discoverability/

[85]

https://help.apple.com/app-store-connect/?lang=zh-cn#/dev50869de4a

[86]

https://developer.apple.com/cn/news/?id=lrnyc3aj

[87]

https://developer.apple.com/cn/app-store/subscriptions/#offer-codes

[88]

https://tools.applemediaservices.com/app-store/

[89]

https://developer.apple.com/cn/app-store/marketing/guidelines/#section-products

[90]

https://help.apple.com/asc/appspromoart/#/

[91]

https://developer.apple.com/cn/support/app-store/

[92]

https://www.apple.com/legal/internet-services/itunes/appstorenotices/#/contacts?lang=zh

[93]

https://developer.apple.com/design/resources/


转自:掘金  37手游iOS技术运营团队

https://juejin.cn/post/6992134804997160996#heading-13

- EOF -

推荐阅读  点击标题可跳转

1、你不知道的国际化插件 vue-swift-i18n

2、苹果“重心”转移,终端退位?

3、硅谷一万清华人,为何打不过印度人?


看完本文有收获?请分享给更多人

关注「 iOS大全 」加星标,关注 iOS 动态

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存